package com.mc.mcgoweb.utils.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式测试
 */
public class RegexpTest {
    public static void main(String[] args) {
        /**
         * 自定义字符集合：
         * [ ]方括号匹配方式，能够匹配方括号中任意一个字符
         * [ab5@]  匹配 "a" 或 "b" 或 "5" 或 "@"
         * [^ abc]   匹配 "a","b","c" 之外的任意一个字符
         * [f-k]  匹配 "f"~"k" 之间的任意一个字母
         * [^A-F0-3]  匹配 "A"~"F","0"~"3" 之外的任意一个字符
         * 正则表达式的特殊符号，被包含到中括号中，则失去特殊意义，
         * 除了^,-之外
         *
         * 标准字符集合，除小数点外，如果被包含于中括号，自定义字符集合
         * 将包含该集合。比如：
         * • [\d.\-+]将匹配：数字、小数点、+、-
         *
         *
         *  修饰匹配次数的特殊符号
         *  {n}  表达式重复n次
         *  {m,n}  表达式至少重复m次，最多重复n次
         *  {m,}  表达式至少重复m次?  匹配表达式0次或者1次，相当于 {0,1}
         *  +  表达式至少出现1次，相当于 {1,}
         *  *  表达式不出现或出现任意次，相当于 {0,}
         */



        String a = "abc.cde.aop";

        System.out.println(a.split("\\.")[0]);
        String b = "12345678910";
        String[] split = b.split("\\d{8}");
        String c = "df  dsfsd fdsfs ";
        /**
         * \d 任意一个数字，0~9 中的任意一个
         * \w  任意一个字母或数字或下划线，也就是 A~Z,a~z,0~9,_ 中任
         * \s  包括空格、制表符、换行符等空白字符的其中任意一个
         * . 小数点可以匹配任意一个字符(除了换行符)如果要匹配包括“\n”在内的所有字符，一般用[\s\S]
         */
        String s = c.replaceAll("\\s", "");
        System.out.println(s);
        String d = "fumengabccici";
        String s1 = d.replaceAll("fumeng|cici", "");
        System.out.println(s1);
        /**断言语法
         * (?=exp)  断言自身出现的位置的后面能匹配表达式exp(?<=exp)  断言自身出现的位置的前面能匹配表达式exp
         * (?!exp)  断言此位置的后面不能匹配表达式
         * exp(?<!exp)  断言此位置的前面不能匹配表达式exp
         */
        String f = "abcmc abmc ccicimc";
        String s2 = f.replaceAll("\\w+(?=mc)", "");
        String f1 = "abcmc123123 abmc ccicimc878";
        //匹配所有字母和数组且后面跟的是数字至少出现一次  或者空格制表符的\w+(?=\d+)|\s
        String s22 = f1.replaceAll("\\w+(?=\\d+)|\\s", "");
        System.out.println("s22:" + s22);
        System.out.println(s22);

        /**
         * 字符边界– (本组标记匹配的不是字符而是位置，符合某种条件的位置)–
         * \b匹配这样一个位置：前面的字符和后面的字符不全是\w
         * ^ 与字符串开始的地方匹配
         * $  与字符串结束的地方匹配
         * \b  匹配一个单词边界
         */
        String f11 = "abcmc123123 abmc4545 ccicimc878";
        //匹配以ab开头的字符串替换为空字符串 ^ab
        String s3 = f11.replaceAll("^ab", "");
        System.out.println(s3);

        /**
         * 电话号码验证
         * – (1)电话号码由数字和"-"构成
         * – (2)电话号码为7到8位
         * – (3)如果电话号码中包含有区号，那么区号为三位或四位, 首位是0.
         * – (4)区号用"-"和其他部分隔开
         * – (5)移动电话号码为11位
         * – (6)11位移动电话号码的第一位和第二位为"13“，”15””18”
         */
        String o="13061867208";
        String o1="029-88888888";
        //固话校验 0\d{2,3}-\d{7,9}
        String regex="0\\d{2,3}-\\d{7,9}";
        System.out.println(isMatches(o1, regex));
        //移动手机校验 1\d[356789]\d{9}
        String regex1="1[^247]\\d{9}";
        System.out.println(isMatches(o, regex1));

        /**
         *  电子邮件地址验证
         * 1.用户名：字母、数字、中划线、下划线组成
         * 2.@
         * 3.网址：字母、数字组成
         * 4. 小数点：.
         * 5. 组织域名：2-4位字母组成
         * 不区分大小写
         */
          // [\w\-]+@[a-zA-Z0-9]+(\.[A-Za-Z]{2,4}){1,2}
        // 字母或者-开头  +:至少一次  @ 后面必须是字母或者数字不区分大小写
        String mass="[\\w\\-]+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,4}){1,2}";
        String mail="dsfdsf@163.com";
        String mai2="dsfdsf@qq.com";
        String mai3="dsfdsf@163163.com.cn";
        System.out.println(isMatches(mai3, mass));
        //驼峰匹配转换
        String s8="studentNameAge";
        String s4 = s8.replaceAll("([A-Z])", "_$1");
        System.out.println(s4);

        // 0 代表前面补充0
        // 10代表长度为10
        // d 代表参数为正数型
        String str = String.format("%010d", 120);
        System.out.println(str);

    }

    private static boolean isMatches(String o1, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(o1);
        return matcher.matches();
    }
}
